package _str;

import org.junit.Assert;
import org.junit.Test;

/*
https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html
https://leetcode.cn/problems/reverse-string-ii/description/

541. 反转字符串 II
给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个，则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。

示例 1：
输入：s = "abcdefg", k = 2
输出："bacdfeg"

示例 2：
输入：s = "abcd", k = 2
输出："bacd"

示例 3：
输入：s = "abcdef", k = 3
输出："cbadef"
 */
public class leetcode_541 {
    @Test
    public void test_1() {
        String actual = reverseStr("abcdefg", 2);
        String expect = "bacdfeg";
        Assert.assertEquals(expect, actual);
    }

    @Test
    public void test_2() {
        String actual = reverseStr("abcd", 2);
        String expect = "bacd";
        Assert.assertEquals(expect, actual);
    }

    @Test
    public void test_3() {
        String actual = reverseStr("abcdef", 3);
        String expect = "cbadef";
        Assert.assertEquals(expect, actual);
    }


    public String reverseStr(String s, int k) {
        // T - N
        // S - N
        char[] array = s.toCharArray();
        int len = array.length;
        for (int i = 0; i < len; i = i + 2 * k) {
            // TODO: 注意边界
            if (i + k <= len) {
                // TODO: 注意边界
                swap(array, i, i + k - 1);
                continue;
            }
            swap(array, i, len - 1);
        }
        return new String(array);
    }

    private void swap(char[] array, int i, int j) {
        // 交换包含j
        char temp;
        for (; i < j; i++, j--) {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
}
